package com.mic.yzzn.plc.common.instructions.request;

import com.mic.yzzn.plc.common.ins.datastructure.PLCDataRegisterNumber;
import com.mic.yzzn.plc.common.instructions.basic.PLCRequestInstruction;

/**
 * Created by ASH on 16/3/7.
 */
public class PLCDataRegisterInstruction extends PLCRequestInstruction
{
	/** 数据代码 */
    protected String dataCode;
    /** 寄存器范围编码 */
    protected PLCDataRegisterNumber dataRegisterNumber;

    /**
     * 初始化方法
     */
    public PLCDataRegisterInstruction()
    {
        dataRegisterNumber = new PLCDataRegisterNumber();
    }

    /**
     * 数据代码get方法
     * @return 数据代码
     */
    public String getDataCode()
    {
        return dataCode;
    }

    /**
     * 寄存器编号get方法
     * @return 寄存器编号
     */
    public PLCDataRegisterNumber getDataRegisterNumber()
    {
        return dataRegisterNumber;
    }

    /**
     * 数据代码set方法
     * @param dataCode 数据代码
     */
    public void setDataCode(String dataCode)
    {
        this.dataCode = dataCode;
    }

    /**
     * 寄存器编号set方法
     * @param dataRegisterNumber
     */
    public void setDataRegisterNumber(PLCDataRegisterNumber dataRegisterNumber)
    {
        this.dataRegisterNumber = dataRegisterNumber;
    }

    /**
     * 计算并返回每一位的异或
     */
    @Override
    protected int getXORByBit()
    {
        int result = 0;
        int i = 0;

        for (i = 0; i < dataCode.length(); ++i)
        {
            result ^= dataCode.charAt(i);
        }

        return super.getXORByBit() ^ dataRegisterNumber.getXORByBit() ^ result;
    }

    /**
     * 转换成字符串
     */
    @Override
    public String toString()
    {
        // 拼接指令字符串
        StringBuffer buffer = new StringBuffer();
        buffer.append(instructionHeader);
        buffer.append(locationNumber_high);
        buffer.append(locationNumber_low);
        buffer.append(instructionTypeCode);
        buffer.append(requestCode);
        buffer.append(dataCode);
        buffer.append(dataRegisterNumber.toString());
        buffer.append(getBBC_high());
        buffer.append(getBBC_low());
        buffer.append(instructionEnd);

        return buffer.toString();
    }
}
